﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using ConfeccionesJR.Entites;
using ConfeccionesJR.BussinesLogic;
using Microsoft.Practices.Unity;

namespace ConfeccionesJR.UI
{
    public partial class frmMttoMaterial : Form
    {
        [Dependency]
        public IMaterialBL materialBL { get; set; }

        [Dependency]
        public IUnidadMedidaBL unidMedidaBL { get; set; }

        bool isNew;

        public Int32 IdMat { get; set; }

        public frmMttoMaterial()
        {
            InitializeComponent();
            this.BuildUp();

            uNIDAD_MEDIDABindingSource.DataSource = unidMedidaBL.GetAllFromUnidaMedidas();
        }

        private void frmMttoMaterial_Load(object sender, EventArgs e)
        {
            if (isNew == false)
            {
                var _material = materialBL.GetFromMaterialById(IdMat);
                _material.UNIDAD_MEDIDA = unidMedidaBL.GetFromUnidadMedidaById(_material.unidadMedidaId);

                mATERIALBindingSource.DataSource = _material;

                cbUndMedida.SelectedValue = _material.unidadMedidaId;
            }  
        }

        public void Nuevo()
        {
            isNew = true;
            lblNuevoCosto.Visible = false;
            txtNuevoCosto.Visible = false;
            mATERIALBindingSource.AddNew();
        }

        public void Editar(Int32 id)
        {
            isNew = false;
            lblNuevoCosto.Visible = false;
            txtNuevoCosto.Visible = false;

            var _material = materialBL.GetFromMaterialById(id);
            _material.UNIDAD_MEDIDA = unidMedidaBL.GetFromUnidadMedidaById(_material.unidadMedidaId);

            mATERIALBindingSource.DataSource = _material;
        }

        public void EditarOfCompra(decimal nuevoCosto, Int32 IdMat)
        {
            isNew = false;
            lblNuevoCosto.Visible = true;
            txtNuevoCosto.Visible = true;

            var _material = materialBL.GetFromMaterialById(IdMat);

            _material.UNIDAD_MEDIDA = unidMedidaBL.GetFromUnidadMedidaById(_material.unidadMedidaId);

            mATERIALBindingSource.DataSource = _material;

            cbUndMedida.SelectedValue = _material.unidadMedidaId;

            if (nuevoCosto > _material.Costo)
            {
                costoTextBox.BackColor = System.Drawing.Color.Red;
                costoTextBox.ForeColor = System.Drawing.Color.White;
                txtNuevoCosto.Text = nuevoCosto.ToString();
            }
            if (nuevoCosto < _material.Costo)
            {
                costoTextBox.ForeColor = System.Drawing.Color.White;
                txtNuevoCosto.Text = nuevoCosto.ToString();
                costoTextBox.BackColor = System.Drawing.Color.Green;
            }

            if (nuevoCosto == _material.Costo)
            {
                costoTextBox.ForeColor = System.Drawing.Color.White;
                costoTextBox.BackColor = System.Drawing.Color.Yellow;
                txtNuevoCosto.Text = nuevoCosto.ToString();
            }


        }

        private void uNIDAD_MEDIDAComboBox_Click(object sender, EventArgs e)
        {
            uNIDAD_MEDIDABindingSource.DataSource = unidMedidaBL.GetAllFromUnidaMedidas();
        }

        private void BtnGuardar_Click(object sender, EventArgs e)
        {
            var undMedida = uNIDAD_MEDIDABindingSource.Current as UNIDAD_MEDIDA;
            var currentMaterial = mATERIALBindingSource.Current as MATERIAL;

            var msg = "ERROR";
            if (currentMaterial != null)
            {
                currentMaterial.Descripcion = descripcionTextBox.Text.ToUpper();
                currentMaterial.Costo = Convert.ToDecimal(costoTextBox.Text.ToUpper());
                if (isNew == true)
                {
                    try
                    {
                        materialBL.AddMaterial(currentMaterial);
                        MessageBox.Show("Registro Correcto", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        Close();
                    }
                    catch (Exception ex)
                    {
                        msg = ex.Message;
                        MessageBox.Show(msg, "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
                if (isNew == false)
                {
                    try
                    {
                        currentMaterial.UNIDAD_MEDIDA = undMedida;
                        materialBL.UpdateMaterial(currentMaterial);
                        isNew = true;
                        Editar(currentMaterial.Id);
                        MessageBox.Show("Modificación Correcta", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        Close();
                    }
                    catch (Exception ex)
                    {
                        msg = ex.Message;
                        MessageBox.Show(msg, "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }

                }
            }
        }

        private void btnVerificarDesc_Click(object sender, EventArgs e)
        {
            if (descripcionTextBox.Text.Length > 0)
            {
                VerificarDescripcion();
                costoTextBox.Focus();
            }
            else
            {
                MessageBox.Show(this, "La Descripción es requerida", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                descripcionTextBox.Focus();
            }
        }

        private void VerificarDescripcion()
        {
            #region Add
            if (isNew == true)
            {
                var descripcion = materialBL.GetOneMaterialByDescripcion(descripcionTextBox.Text);

                if (descripcion != null)
                {
                    var currentMaterial = descripcion as MATERIAL;
                    mATERIALBindingSource.DataSource = descripcion;

                    DialogResult rpta = MessageBox.Show(this, string.Format("Ya existe un Material con la misma descripción"),
                        "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    if (rpta == DialogResult.OK && isNew == true)
                    {
                        Close();
                    }
                }
                else
                {
                    MessageBox.Show(this, "Descripción disponible", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            #endregion
            #region Update
            else
            {
                var _material = mATERIALBindingSource.Current as MATERIAL;
                var existe = materialBL.ExisteDuplicidadMatDescripcion(descripcionTextBox.Text, _material.Id);
                if (existe)
                {
                    DialogResult rpta = MessageBox.Show(this, string.Format("Ya existe un Material con la misma descripción"),
                        "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    MessageBox.Show(this, "Descripción disponible", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            #endregion
        }

        private void descripcionTextBox_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                if (descripcionTextBox.Text.Length > 0)
                {
                    VerificarDescripcion();
                    costoTextBox.Focus();
                }
                else
                {
                    MessageBox.Show(this, "La Descripción es requerida", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    descripcionTextBox.Focus();
                }
            }
        }

        private void costoTextBox_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (
                !char.IsNumber(e.KeyChar) &&
                !char.IsDigit(e.KeyChar) &&
                e.KeyChar != (char)Keys.Back &&
                e.KeyChar != (char)Keys.Enter
                )
            {
                e.Handled = true;
            }

            if (e.KeyChar == '.' || e.KeyChar == '\b')
            {
                e.Handled = false;
            }
        }

        private void descripcionTextBox_KeyPress(object sender, KeyPressEventArgs e)
        {
            var guion = Convert.ToString("-");
            var slash = Convert.ToString("/");
            var punto = Convert.ToString(".");
            string cadena = guion + slash + punto + (char)8;

            if (!cadena.Contains(e.KeyChar) && !(char.IsLetter(e.KeyChar)) && !(char.IsNumber(e.KeyChar))
                && (e.KeyChar != (char)Keys.Back) && (e.KeyChar != (char)Keys.Enter) && (e.KeyChar != (char)Keys.Clear)
                && !(char.IsSeparator(e.KeyChar)))
            {
                e.Handled = true;
                return;
            }
        }

        private void precioTextBox_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (
                !char.IsNumber(e.KeyChar) &&
                !char.IsDigit(e.KeyChar) &&
                e.KeyChar != (char)Keys.Back &&
                e.KeyChar != (char)Keys.Enter
                )
            {
                e.Handled = true;
            }

            if (e.KeyChar == '.' || e.KeyChar == '\b')
            {
                e.Handled = false;
            }
        }

    }
}
